在 Day 5我們學過如何使用 ImageView,為你的 App 加上漂亮的「相框」,讓它充滿色彩。
但是,當我們遇到一個問題:如果你的「相框」裡要放的是數百張網路照片,還每次都要重新下載一次,那會發生什麼事呢?你的 App 可能會變得非常卡頓,甚至當機。
今天,我們要學習一個「專業的圖片搬運工」—— Glide,讓你的 App 載入圖片又快又順。
setImageResource()?想像一下,你的 App 就像一間餐廳,圖片就是你要端給客人的菜餚。
當你用 setImageResource() 顯示本地圖片時,就像是廚師直接從廚房裡的冰箱(drawable 資料夾)拿出食材,非常快。
但是,當你要從網路載入圖片時,就像是廚師每次都要跑到很遠的超市(伺服器)去採買,再回來料理。如果客人很多(像是 RecyclerView 裡有數百張照片),廚師就會累到跑不動,整個餐廳(App)的服務都會停擺。
簡單比喻:Glide 就像是你的餐廳請了一位專業的物流經理。這位經理會幫你處理所有跟圖片有關的雜事,讓你的廚師(主執行緒)可以專心工作。
核心用途:
今天,我們要修改你 Day 9 的 RecyclerView 專案,讓它能流暢地顯示網路圖片!
步驟 1:新增 Glide 函式庫
要請這位物流經理(Glide)來幫忙,你需要在你的專案中簽約。
打開你的 build.gradle (Module) 檔案,在 dependencies 區塊裡,加上這兩行程式碼:
`dependencies {
// ... 其他依賴
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}`
接著,點擊右上角的 "Sync Now",讓 Android Studio 安裝這個函式庫。
步驟 2:修改你的 RecyclerView Adapter
打開你的 Adapter 檔案(例如 MyAdapter.java),找到 onBindViewHolder() 這個方法。
假設你的資料來源(例如 ArrayList)中,有一個 imageUrl 欄位來存放圖片網址。你只需要用一行程式碼,就能告訴 Glide,請他把圖片載入到你的 ImageView 上。
`// 這是 RecyclerView 的 Adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
// ... 其他程式碼
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
// 假設你的資料物件 Product 有一個 getImageURL() 方法
String imageUrl = productList.get(position).getImageURL();
// 告訴 Glide,請他把圖片從這個網址(imageUrl)載入到這個 ImageView(holder.imageView)
Glide.with(holder.itemView.getContext())
.load(imageUrl)
.into(holder.imageView);
}
// ... 其他程式碼
}`
程式碼解釋:
Glide.with(): 告訴 Glide,我們要在哪個「範圍」(例如 App 畫面)內使用它。.load(imageUrl): 這是最重要的指令,告訴 Glide 你要載入的圖片網址是什麼。.into(holder.imageView): 告訴 Glide,要把圖片顯示在哪一個「相框」(ImageView) 裡。執行你的 App!
當你再次執行你的 App,你會發現 RecyclerView 列表中的圖片載入變得非常順暢。即使你快速滑動,圖片也能很快地顯示出來,不再有卡頓感。
今天我們學會了:
明天見!